package com.dragon.refect.gc;

/**
 * -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:+PrintCommandLineFlags
 * -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=5 -XX:+PrintTenuringDistribution
 * <p>
 * -XX:MaxTenuringThreshold: 设置可以晋升到老年代的最大的阈值，默认为15岁,理论上的最大值，一个新生代的年龄不可能大于自定义设置的这个年纪
 * 当一个对象在Eden区间出生并经过第一次Minor GC 后依然存活，并且能被Survivor容纳的话，将被移动到Survivor空间中，
 * 并且对象年龄设为1。对象在Survivor区中每"熬过"一次Minor GC,年龄就会加1岁，当他的年龄增加到一定程度(默认为15岁),就会被晋升到老年代。
 * <p>
 * 长期存活的对象将进入老年代
 * <p>
 * notes: 在CMS中默认值为6，G1中默认值为15(JVM中，该数值是由4个bit位来表示的，所以最大值为1111，即15)
 * <p>
 * 经历了多次GC后，存活的对象会在From Survivor 和 To Survivor 之间来回存放，而这里面有一个前提是这两个空间有足够的空间的大小来存放这些数据，
 * 在GC算法中，会计算每个年龄的大小，如果达到某个年龄后发现总大小已经大于了Survivor空间的50%,那么这时就需要要调整阈值，不能再继续等到默认的15次GC
 * 后才完成晋升，因为这样会导致Survivor空间不足，所需要调整阈值，让这些存活对象尽快晋升。
 *
 * @author dragon
 * @since 2019/12/15
 */
public class MyTest5 {

    private static final int _1M = 1024 * 1024;

    public static void main(String[] args) {

        byte[] myAlloc1 = new byte[2 * _1M];

        byte[] myAlloc2 = new byte[2 * _1M];

        byte[] myAlloc3 = new byte[2 * _1M];

        byte[] myAlloc4 = new byte[2 * _1M];

        System.out.println("hello world");
    }
}
